package br.ufg.inf.espweb.sgca.service.impl;

import br.ufg.inf.espweb.sgca.dao.DocenteDao;
import br.ufg.inf.espweb.sgca.dao.GenericDao;
import br.ufg.inf.espweb.sgca.model.Docente;
import br.ufg.inf.espweb.sgca.model.TipoDeDocente;
import br.ufg.inf.espweb.sgca.service.DocenteService;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author diCastro
 */
@Service
@Scope("prototype")
@Transactional(propagation = Propagation.REQUIRED)
public class DocenteServiceImpl extends GenericServiceImpl<Docente> implements DocenteService{
    
    @Autowired
    private DocenteDao docenteDao;
    
    @Override
    protected GenericDao<Docente> getDao() {
        return docenteDao;
    }
    
    @Override
    public Map<String, String> importarProfessores(BufferedReader arquivoCSV) throws IOException{
        Map<String, String> falhas = new HashMap<>();
        arquivoCSV.readLine();
        String linha = arquivoCSV.readLine();
        List<Docente> professores = new ArrayList<>();
        String csvSpltBy = ",";
        String[] linhaPicotada;
        Docente professor;
        while(linha != null){
            linhaPicotada = linha.split(csvSpltBy);
            if(linhaPicotada.length != 2){
                falhas.put(linha, "Linha não está no padrão configurado");
            }else if(linhaPicotada[0] == null || linhaPicotada[0].isEmpty()){
                falhas.put(linha, "ID não está definido");
            }else if(linhaPicotada[1] == null || linhaPicotada[1].isEmpty()){
                falhas.put(linha, "Nome do professor não está definido");
            }else{
                professor = docenteDao.buscarDocentePeloNomeCompleto(linhaPicotada[1]);
                if(professor == null){
                    try {
                        professor = new Docente(TipoDeDocente.PROFESSOR);
                        professor.setNome(linhaPicotada[1].split(" ")[0]);
                        professor.setNomeCompleto(linhaPicotada[1]);
                        professor.setIdOriginal(Long.parseLong(linhaPicotada[0].replaceAll("[^0-9]*", "")));
                        //TODO Procurar outros dados no LDAP
                    } catch (NumberFormatException e) {
                        falhas.put(linha, e.getMessage());
                    }
                }else{
                    professor.setIdOriginal(Long.parseLong(linhaPicotada[0]));
                }
                professores.add(professor);
            }
            linha = arquivoCSV.readLine();
        }
        
        for(Docente d : professores){
            if(d.getId() == null){
                docenteDao.salvar(d);
            }else
                docenteDao.atualizar(d);
        }
        
        return falhas;
    }
    
}
